import { ref } from "vue";

export function debounce(func, wait, immediate) {
  let timeout; // 定义一个计时器变量，用于延迟执行函数
  return function (...args) {
    // 返回一个包装后的函数
    const context = this; // 保存函数执行上下文对象
    const later = function () {
      // 定义延迟执行的函数
      timeout = null; // 清空计时器变量
      if (!immediate) func.apply(context, args); // 若非立即执行，则调用待防抖函数
    };
    const callNow = immediate && !timeout; // 是否立即调用函数的条件
    clearTimeout(timeout); // 清空计时器
    timeout = setTimeout(later, wait); // 创建新的计时器，延迟执行函数
    if (callNow) func.apply(context, args); // 如果满足立即调用条件，则立即执行函数
  };
}

export function clearObject(obj) {
  for (const k in obj) {
    obj[k] = "";
  }
}

export function createRandomColor() {
  let colorObj = ref({});
  function getRandomInt(min, max) {
    // 返回 min（包含）与 max（包含）之间的随机整数
    return Math.floor(Math.random() * (max - min + 1)) + min;
  }

  function getRandomRgba() {
    const r = getRandomInt(0, 255);
    const g = getRandomInt(0, 255);
    const b = getRandomInt(0, 255);
    const a = Math.random().toFixed(2); // 随机生成透明度通道值，范围 0 到 1，保留两位小数
    return {
      r,
      g,
      b,
      a,
    };
  }

  for (let i = 1; i <= 10; i++) {
    const rgba = getRandomRgba();
    colorObj.value[
      i
    ] = `linear-gradient(to right bottom, rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, 1), rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a}))`;
  }

  return colorObj;
}

export function createRandom16Color() {
  var colorStr = "#";
  function randomColor() {
    var items = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "a", "b", "c", "d", "e", "f"];
    var index = Math.floor(Math.random() * 15);
    return items[index];
  }
  for (let i = 0; i < 6; i++) {
    colorStr += randomColor();
  }

  return colorStr;
}

// 校验n是否是一个数字或字符串数字且是否是有限的, 是则返回
export const validateNumber = (n) => {
  return !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == n ? Number(n) : 0;
};

export function formatNumber(number, point = 0) {
  let value = Number(number);
  if (isNaN(value)) {
    return "0";
  }
  return new Intl.NumberFormat("en-US", {
    minimumFractionDigits: point,
  }).format(value);
}

export function validatePcMobile() {
  return navigator.userAgent.match(
    /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i
  );
}
